package 几数之和.三数之和和四数之和;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * @author zhengTao
 * @version 1.0
 * @description: 三数之和 ，这道题更加适合双指针
 * @date 2022/10/17 10:15
 */
public class Demo15 {
    public static void main(String[] args) {
        int[] ints = {0, 0, 0};
        List<List<Integer>> lists = threeSum(ints);
        System.out.println(lists);

    }
    public static List<List<Integer>> threeSum(int[] nums) {
        List<List<Integer>> res=new ArrayList<>();
        //先排序
        Arrays.sort(nums);
        for (int i = 0; i < nums.length; i++) {
            if(nums[i]>0){
                return res;
            }
            if(i>0&&nums[i]==nums[i-1]){
                continue;
            }
            int left=i+1;
            int right=nums.length-1;
            //为什么是小于，而不是小于等于，因为等于的话就证明left==right,题目说了三个数不能相同
            // 不满足i != j、i != k 且 j != k
            while (left<right){
                 int sum=nums[i]+nums[left]+nums[right];
                 if(sum<0){
                     left++;
                 }else if(sum>0){
                     right--;
                 }else {
                     res.add(Arrays.asList(nums[i],nums[left],nums[right]));
                     //先判断前提条件left<right，在判断后置条件，
                     // 需要用到&&而不是& (&&表示先判断第一个，不满足就返回结果，而&两个都需要判断)
                     while (left<right&&nums[left]==nums[left+1]){
                         left++;
                     }
                     while (left<right&&nums[right]==nums[right-1]){
                         right--;
                     }
                     left++;
                     right--;
                 }
            }
        }
         return  res;
    }
}
